
/**
 * @ProjectName: 
 * @Copyright: 2014 lisheng  All Right Reserved.
 * @address: toughheart@163.com
 * @date: 2015年1月13日 下午12:01:49
 * @Description: 本内容未经本人允许禁止使用、转发.
 */
 
package com.ls.fw.search.lucene.server;

import java.util.List;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.joda.time.DateTime;

import com.ls.fw.search.lucene.bean.SearchCondition;
import com.ls.fw.search.lucene.mapper.DocMapper;
import com.ls.fw.search.lucene.mapper.LoadMapper;
import com.ls.fw.search.lucene.server.base.BaseServer;


/**
 * lucene服务处理接口
 * @author lisheng
 * @date 2015年1月13日 下午12:01:49
 * @version V1.0 
 */
public interface MutilServer<T> extends BaseServer {

	
	public void load();
	
	public void load(LoadMapper mapper);
	
	public LuceneServer create(T flag);
	
	public LuceneServer get(T flag);
	
	public LuceneServer getByKey(String key);
	
	public LuceneServer remove(String key);
	
	public List<LuceneServer> get(T start, T end);
	
	public List<LuceneServer> get(T start, T end, boolean desc);
	
	public int getStep(DateTime start, DateTime end);
	
	public String getKey(T flag); 
	
	
	/**
	 * 默认为降序的当前标识的下一个服务
	 * start - 1
	 * @author lisheng
	 * @date 2015年1月13日 下午12:19:28
	 * @version V1.0
	 * @param start
	 * @return
	 */
	public LuceneServer getNextServer(T start);
	
	
	/**
	 * 默认为降序的当前标识的上一个服务
	 * end + 1
	 * @author lisheng
	 * @date 2015年1月13日 下午12:19:24
	 * @version V1.0
	 * @param end
	 * @return
	 */
	public LuceneServer getLastServer(T end);
	
	
	/**
	 * 默认为降序的当前标识的下step个服务
	 * start - step
	 * @author lisheng
	 * @date 2015年1月13日 下午12:19:14
	 * @version V1.0
	 * @param flag
	 * @param step
	 * @return
	 */
	public LuceneServer getNextServer(T start, int step);

	
	/**
	 * 默认为降序的当前标识的上step个服务
	 * end + step
	 * @author lisheng
	 * @date 2015年1月13日 下午12:18:55
	 * @version V1.0
	 * @param flag
	 * @param step
	 * @return
	 */
	public LuceneServer getLastServer(T end, int step);

	
	/**
	 * 默认为降序的上step个key
	 * end + step
	 * @author lisheng
	 * @date 2015年1月13日 下午12:41:43
	 * @version V1.0
	 * @param end
	 * @param step
	 * @return
	 */
	public String getLastKey(DateTime end, int step);

	
	/**
	 * 默认为降序的上一个key
	 * end+1
	 * @author lisheng
	 * @date 2015年1月13日 下午12:41:50
	 * @version V1.0
	 * @param end
	 * @return
	 */
	public String getLastKey(DateTime end);

	
	/**
	 * 默认为降序的
	 * @author lisheng
	 * @date 2015年1月13日 下午12:41:56
	 * @version V1.0
	 * @param start
	 * @param step
	 * @return
	 */
	public String getNextKey(DateTime start, int step);

	
	/**
	 * 默认为降序的
	 * @author lisheng
	 * @date 2015年1月13日 下午12:42:01
	 * @version V1.0
	 * @param start
	 * @return
	 */
	public String getNextKey(DateTime start);
	
	
	public String getBaseDir();
	
	public String getDir(String key);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午12:55:23
	 * @version V1.0
	 * @param key
	 * @return
	 */
	public LuceneServer createByKey(String key);
	
	
	/**
	 * 获取服务搜索器
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午1:40:00
	 * @version V1.0
	 * @param start
	 * @param end
	 * @return
	 */
	public IndexSearcher getIndexSearcher(DateTime start, DateTime end);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午1:39:06
	 * @version V1.0
	 * @param start
	 * @param end
	 * @return
	 */
	public List<IndexReader> getIndexReaders(DateTime start, DateTime end);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月13日 下午1:39:10
	 * @version V1.0
	 * @param list
	 * @return
	 */
	public List<IndexReader> getIndexReaders(List<LuceneServer> list);
	
	

	/**
	 * 提交
	 */
	public void commit(String... keys);
	
	
	
	/**
	 * 关闭服务
	 */
	public void close(String... keys);
	
	public <M> List<M> scan(SearchCondition searchCondition, T end, int step, DocMapper<M> mapper);
	
	
	public <M> List<M> scan(SearchCondition searchCondition, T start, T end, DocMapper<M> mapper);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月16日 下午8:50:33
	 * @version V1.0
	 * @param serverlist
	 * @param searchCondition
	 * @return
	 */
	long count(List<LuceneServer> serverlist, SearchCondition searchCondition);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月18日 下午1:15:45
	 * @version V1.0
	 * @param searchCondition
	 * @param start
	 * @param end
	 * @param mapper
	 * @return
	 */
	<M> List<M> search(SearchCondition searchCondition, DateTime start,
			DateTime end, DocMapper<M> mapper);

	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月18日 下午2:16:24
	 * @version V1.0
	 * @return
	 */
	boolean canHandl();
	
}
